package cn.yzgy.yzgyoa.common.utils;

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;

/**
 * 时间工具类
 * 提供静态获取、格式化时间的功能，提供format模板，字符串格式时间等
 *
 * @author Yqsen
 * @since 2019-8-22 14:00:13
 */
@SuppressWarnings({"unused", "WeakerAccess"})
public class TimeUtil {

    public static final String STANDARD_TIME_FORMAT_STRING = "yyyy-MM-dd HH:mm:ss";
    public static final String NO_SEPARATOR_TIME_FORMAT_STRING = "yyyyMMddHHmmss";
    public static final String YMD_TIME_FORMAT_STRING = "yyyyMMdd";
    public static final Integer TIME_ZONE = 8;

    /**
     * 返回格式化的当前时间
     *
     * @param timeFormat 时间格式化字符串
     * @return 格式化后的时间
     */
    public static String getCurrentTimeString(String timeFormat) {
        return getSimpleDateFormat(timeFormat).format(new Date());
    }

    public static String getCurrentTimeString(){
        return getSimpleDateFormat().format(new Date());
    }

    public static SimpleDateFormat getSimpleDateFormat(){
        return getSimpleDateFormat(STANDARD_TIME_FORMAT_STRING);
    }

    public static SimpleDateFormat getSimpleDateFormat(String format){
        return new SimpleDateFormat(format);
    }

    public static LocalDateTime getCovertTimeFromIsoDate(String timeString) {
        return LocalDateTime.parse(timeString, DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss'Z'")).plusHours(TIME_ZONE);
    }

    /**
     * 处理一下时区
     * @param timeString 原始时间字符串ISODATE
     * @return GMT+8 时区的系统标准时间格式的时间字符串
     */
    public static String getCovertTimeFromIsoDateStr(String timeString) {
        return getCovertTimeFromIsoDate(timeString).format(DateTimeFormatter.ofPattern(STANDARD_TIME_FORMAT_STRING));
    }

    /**
     * 获取Date类型日期中的月
     * @param date date型日期
     * @return 月
     */
    public static int getMonthOfDate(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.MONTH) + 1;
    }

    /**
     * 计算月份差
     * 默认认为小一些的月份在大一些的月份的后一年
     * @param startMonth 开始月份
     * @param curMonth 当前月
     * @return 差额
     */
    public static int monthDiff(int startMonth, int curMonth) {
        if (startMonth < curMonth) {
            return curMonth - startMonth + 1;
        }
        return 12 - startMonth + curMonth + 1;
    }

}
